leaders2021

ЛИДЕРЫ ЦИФРОВОЙ ТРАНСФОРМАЦИИ 2021 // ХАКАТОН

Разработка рекомендательной системы новостей для пользователей mos.ru и приложения «Моя Москва»

Основной этап


https://leaders2021.innoagency.ru/

Команда DST-OFF

Постановка задачи

Формулировка задачи

Рекомендательная система новостей для пользователей mos.ru и приложения «Моя Москва»

Mos.ru - официальный портал Мэра и Правительства Москвы, рассчитанный на различные сегменты горожан. Сайтом пользуются как авторизованные пользователи, которым доступно оформление услуг, так и неавторизованные пользователи, которые ищут полезную информацию о жизни города в новостях, афише, различных сервисах и услугах.

Задача для участников хакатона:

Изучить сценарии потребления новостей на mos.ru и разработать рекомендательную систему, предлагающую новости для авторизованных и неавторизованных пользователей. В решении также нужно предусмотреть автоматическую разметку новостей по органам исполнительной власти и их руководителям, тематикам, тегам и др.

Хакатон проводится в два этапа: основной и финальный. Данное решение является решением основного этапа хакатона.

В рамках основного этапа участникам предоставлены исторические данные по активным пользователям сервиса mos.ru за август 2021 года за исключением последних 20 кликов. Последние 20 кликов каждого пользователя являются контрольной выборкой - они будут использованы для оценки работы рекомендательной системы.

Цель: предсказать набор из 20 новостей для каждого пользователя.

Формат передачи данных

На вход модели подается id пользователя. Модель возвращает json-файл со следующими полями:

Комментарии к наборам данных (датасетам)

Предоставленный в рамках основного этапа конкурса набор данных размещен в директории data:

  1. dataset_news_1.xlsx - исторические данные по активным пользователям сервиса за месяц за исключением последних 20 кликов в формате:
    • date_time - временная метка;
    • url_clean - url страницы с новостями;
    • user_id - идентификатор пользователя;
  1. news.jsn - json-файл с подробной информацией о структуре и содержании новостей:
    • id
    • title - заголовок новости
    • importance
    • published_at - дата, время публикации
    • created_at, created_at_timestamp
    • updated_at, updated_at_timestamp, canonical_updated_at
    • is_deferred_publication
    • status
    • ya_rss
    • active_from, active_from_timestamp
    • active_to, active_to_timestamp
    • oiv_id
    • search
    • display_image
    • label
    • icon_id
    • canonical_url, url
    • is_powered
    • has_image
    • date, date_timestamp
    • has_district
    • tags
    • theme_id, theme_ids, themes
    • spheres, sphere
    • kind
    • is_oiv_publication
    • organizations - департамент
    • attach
    • image, images
    • counter
    • territory_area_id - округ
    • territory_district_id - район
    • preview_text, preview - аннотация новости
    • full_text, text - текст новости
    • promo
  1. result_task3.csv - шаблон файла ответа для проверки результатов модели:
    • user_id - идентификатор пользователя
    • book_id_1, book_id_2, book_id_3, book_id_4, book_id_5, ... - до 20 идентификаторов рекомендованных новостей

Допускается аргументированное использование наборов открытых данных города Москвы, федеральных наборов открытых данных и прочих открытых данных. При использовании данных за исключением предоставленных датасетов необходима аргументация и оценка их влияния на работу модели, а также описание сбора и обработки данных. Легкость сбора, интеграции и автоматической обработки внешних данных не обязательна, но будет рассматриваться как дополнительное преимущество.

Требования к сопроводительной документации к решению задачи

В сопроводительной документации необходимо описать:

  1. Протестированные гипотезы и алгоритм работы решения;
  2. Оценку работы модели/ансамбля моделей, в том числе:
    • используемые методы обработки данных;
    • методы ML;
    • оценку работы моделей/ансамбля моделей;
    • анализ feature importance;
  3. Дополнительные условия и ограничения, введенные командой для решения задачи.

Требования к коду:

  1. Исходный код должен соответствовать сопроводительной документации;
  2. Должна быть обеспечена возможность выполнения процедур сборки и запуска приведённого кода;
  3. Сложные алгоритмические моменты в коде желательно сопроводить комментариями (будет расцениваться как дополнительное преимущество).
    Задача по созданию рекомендательной истемы может решаться любым способом на усмотрение команды. Участники вправе использовать любые открытые библиотеки. Рекомендованный язык программирования - Python.

Требования к сдаче решений на платформе

  1. Ссылка на сопроводительную документацию (.doc/.pdf);
  2. Ссылка на репозиторий с кодом;
  3. Ссылка на презентацию (требования указаны в шаблоне);
  4. Ссылка на веб-интерфейс.

Критерии оценки для основного этапа (10-24 октября):

Экспертиза прототипов и презентаций проводится по шкале от 0 до 5 баллов с шагом в 1 балл в соответствии со следующим критериями:

Описание решения

Вводная информация для основного этапа конкурса

  1. Имеется лог просмотра новостей авторизованными посетителями сервиса mos.ru с указанием id пользователя, id новости и даты/времени просмотра. 20 последних просмотров для каждого пользователя скрыты.
  2. Имеется датасет новостей с указанием id новости, заголовка, аннотации и текста, частично размеченный по тегам, сферам, темам, округам, районам, департаментам, персонам.
  3. Необходимо для каждого авторизованного пользователя определить 20 скрытых новостей.

Подход команды к решению задачи основного этапа (план)

  1. Провести EDA логов
  2. Подготовить черновой вариант модели на основе информации из логов с помощью матричной факторизации, рассчитать точность работы модели.
  3. Провести EDA новостей
  4. Пересчитать модель с добавлением факторов, присутствующих в датасете новостей.
  5. Обогатить датасет новостей дополнительной разметкой с помощью NLP, добавить факторы к рекомендательной системе
  6. Сформировать датасет посетителей с определением предпочтений (времени посещения, специфики новостей, эмбеддинга), добавить факторы к рекомендательной системе
  7. Оформить решение в виде модели, ваделив обучение и предсказание в отдельные скрипты
  8. Подготовить веб-демонстрацию с помощью streamlit

Ход решения представлен ниже.

Общие соображения к реализации во время финального этапа

Основная идея заключается в более глубоком перекрестном анализе новостей и пользователей. Мы соберем корпус текстов новостей mos.ru, на основе которого обучим нейросеть для решения NLP-задач, в т.ч. классификации и разметки (NER). Пользователей кластеризуем по профилям интересов на основе истории поведения. Отдельная модель определит профиль новых пользователей. Каждая новость получит вес для каждого профиля и при пересечении порога чувствительности будет предложена посетителям сайта.

Что на наш взгляд может заинтересовать посетителя сайта mos.ru и что можно будет включить в решение:

Импорт библиотек, настройки, служебные функции

Загрузка, очистка и обработка лог-файла, анализ данных

Загрузка лог-файла


В логах нет пропусков, видно, что логи предоставлены за август 2021 года. \ Посетителей в логах мало, всего 239, что дает в среднем 111 просмотров на посетителя. \ Всего в логах 5911 ссылок, в среднем 4,5 просмотра на ссылку.


Подготовка датасета логов для поиска неявных закономерностей


В предоставленных логах есть несколько ссылок в формате, отличном от ожидаемого. \ Извлечем id новости с учетом этого обстоятельства и удалим неидентифицированные записи.



В результате обработки удалено 2 записи в логах. \ При этом количество уникальных новостей уменьшилось на 101 - с 5911 до 5810. \ Отсюда следует вывод:

ОДНА И ТА ЖЕ НОВОСТЬ МОЖЕТ ИМЕТЬ НЕСКОЛЬКО ССЫЛОК

При этом id новости остается уникальным. \ Это связано с тем, что, если новость относится к разным сферам, то для каждой сферы формируется своя ссылка.


Проведение разведывательного анализа данных датасета логов


Из статистической сводки видно, что просмотры по посетителям распределены относительно равномерно, \ 80% просмотров приходится на 61% посетителей (145/239). \ При этом 80% просмотров дают только 29% новостей (1663/5810).



Из предоставленных данных видно, что на выходных в августе посещаемость сервиса кратно ниже будней. \ Также наблюдается серьезное проседание посещаемости 24-27 и, особенно 30-31 августа. \ Это говорит в пользу предположения, что именно на эти дни приходится большая часть скрытых контрольных просмотров. \ Всего количество скрытых просмотров составляет 239 * 20 = 4780.



На сетке диаграмм парных распределений можно выделить несколько перспективных пар для более глубокого изучения



Четко прослеживается граница в районе news_sid == 2700. \ Новости и посетители отсортированы по убыванию встречаимости в логах. \ Проанализируем подробнее.



Видно, что из 5810 новостей около 2700 имеют более 1 просмотра, около 1750 новостей - более 2 просмотров, \ менее 1350 - более 3 просмотров. \ При подготовке модели можно рассмотреть вариант с отсечением редко просматриваемых новостей.



Мы видим, что большая часть посетителей просматривает ресурс mos.ru с 9:00 до 18:00.



На диаграмме видны сессии пользователей. Пользователи отсортированы по количеству просмотров. \ В верхнем левом углу диаграммы визуально выделяется группа пользователей со специфичным поведением.



Диаграмма показывает срок актуальности новостей, новости отсортированы по дате и времени первого просмотра. \ Видно, что наибольшая интенсивность просмотров приходится на первые два дня. \ Также форма графика показывает скорость появления новых новостей. \ По графику можно определить, что в первой половине августа появилось около 4000 новостей, \ во второй половине августа - около 2000 новостей



Диаграмма показывает сессии посетителей, отсортированных по возрастанию даты, времени первого просмотра. \ Можно предположить, что из 239 посетителей около 60 впервые посетили сервис в августе. \ Также можно выделить несколько различных сценариев поведения посетителей.



Диаграмма показывает сессии посетителей, отсортированных по убыванию даты, времени последнего просмотра. \ В обычной ситуации прерывание последовательности регулярных сессий показывает, что посетитель перестал пользоваться сервисом. \ Однако мы помним, что 20 последних просмотров в августе скрыты из лог-файла. \ \ Дополнительного комментария заслуживает ситуация с посетителями, сессии которых показаны вверху диаграммы (около 20 из 239). \ Даже с учетом дополнительных 20 просмотров они или покинули сервис до середины августа или по ним скрыто больше просмотров.



На каждого посетителя в датасете в августе приходится от 30 до 535 просмотров новостей без учета 20 скрытых просмотров. \ При выделении тестовой выборки в 20 просмотров в обучающей выборке останется только 10 записей. Этого явно мало. \ Будем использовать в качестве тестовой выборки 10 последних просмотров новостей.


Data Cleaning and Preprocessing function

Получив базовое понимание содержимого датасета лога, подготовим итоговую функцию для очистки и препроцессинга

Train Test Split function

Подготовим функцию для разделения датасета логов на трейн и тест.

Используем параметр slot_size для указания количества последних просмотров, выделяемых в тестовую часть.

Также предусмотрим параметр sparse_level - уровень разреженности матрицы User х News для отсечения из трейна новостей \ с малым количеством просмотров.

Mean Average Precision at K function

Сначала не нашли функцию метрики качества map@K, поэтому написали ее самостоятельно, используя следующие формулы:

Формула map@K - Mean Average Precision at K: $$map@K = \frac{\sum_{i=1}^N ap@K(i)}{N}$$

ap@K(i) - Average Precision at K для пользователя i, N - количество пользователей.

Формула ap@K - Average Precision at K: $$ap@K = \frac{\sum_{i=1}^K p@i}{K}$$

p@i - Precision at i, K - размер списка рекомендованных новостей.

Формула p@K - Precision at i (доля верно угаданных новостей без учета позиции): $$p@i = \frac{ \text{Количество релевантных новостей в первых } {i} \text{ рекомендациях} }{i}$$

Уже потом выяснили, что в LightFM есть функция precision_at_k.

Исследование с помощью SVD и TSNE


Даже на глаз без дополнительной обработки сразу можно выделить несколько кластеров


Загрузка данных с информацией о новостях

Визуализация новостей с интерактивным отображением заголовка новости на диаграмме

Модель LightFM